﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using Controller;
using Interface;

// Dette vindue er lavet af Gruppe 4 DM12a
namespace BookingSystem
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        BookingController minBookingController;

        public MainWindow()
        {
            InitializeComponent();
            minBookingController = new BookingController(); // instansiere BookingController

            lvVærelse.ItemsSource = null; // ItemsSource for lvVærelse nulstilles
            lvVærelse.ItemsSource = minBookingController.VærelseList(); // her sættes lvVærelse.ItemsSource lig med listen af Værelser i VærelseList

            int tal = 1; // der laves plads i hukommelsen til tal, som sættes lig med 1.
            while (tal < 10) // en while løkke der fortsætter så længe "tal" er mindre end 10
            {
                cbPersoner1.Items.Add(tal); // så længe betingelsen er opfyldt sættes "tal" i cbPersoner1
                cbVærelser1.Items.Add(tal);
                tal = tal + 1; // der bliver lagt 1 til "tal"
            }
        }

        private void btnVisKunde_Click(object sender, RoutedEventArgs e)
        {
            VisKundenKvittering visKundenKvittering;

            visKundenKvittering = new VisKundenKvittering(minBookingController); // VisKundenKvittering bliver instansieret og minBookingController sendes med

            visKundenKvittering.ShowDialog(); // her viser den vinduet visKundenKvittering
        }

        private void btnNext_Click(object sender, RoutedEventArgs e)
        {
            FindKunde findKunde = new FindKunde(minBookingController); // FindeKunde bliver instansieret og minBookingController sendes med

            findKunde.ShowDialog(); // vinduet findKunde vises.
            minBookingController.HentAktuelKunde(); // den bruger metoden i minBookingController som hedder HentAktuelKunde, som er uden parametre
            HentBookinger(); // den bruger den metoden HentBookinger, uden parametre
        }

        private void btnExtra_Click(object sender, RoutedEventArgs e)
        {
            Window1 extraTilbehør; // identifier, navngiver Window1 extraTilbehør

            extraTilbehør = new Window1(minBookingController); // den instanstiere vinduet Window1, og sender minBookingcontroller med

            extraTilbehør.ShowDialog(); // viser vinduet extraTilbehør.
        }

        private void btnTilføjVærelse_Click(object sender, RoutedEventArgs e)
        {
            try // try-catch
            { // nu prøver den, det der står inde i try
                int antalVærelser = int.Parse(cbVærelser1.SelectedItem.ToString()); // erklærer variablen.
                int antalPersoner = int.Parse(cbPersoner1.SelectedItem.ToString());
                DateTime ankomst = DateTime.Parse(dpAnkomst.SelectedDate.ToString());
                DateTime afrejse = DateTime.Parse(dpAfrejse.SelectedDate.ToString());
                int bookingId = 0;
                
                    if (ankomst < afrejse && ankomst >= DateTime.Now) // samlign ankomst med dags dato.
                    // hvis betingelsen er opfyldt, inde i if-sætningen
                    {
                        if (lvVærelse.SelectedItem != null && lvVærelse.SelectedItems.Count <= 1) // betingelsen er at lvVærelse.selectedItems skal være 1, ikke mere eller mindre
                        {
                            int forbrugId;

                            IKunde iKunde = minBookingController.HentAktuelKunde(); // erklære variablen iKunde, ved at sætte den lig med metoden HentAktuelKunde inde i minBookingController.

                            for (int i = 1; i <= antalVærelser; i = i + 1) // en forløkke, hvor betingelsen, i<antalVærelser, skal være opfyldt.
                            {
                                IVærelse iVærelse = (IVærelse)lvVærelse.SelectedItem;
                                int værelseId = iVærelse.VærelseId;
                                decimal pris = minBookingController.SamletPris(ankomst, afrejse, værelseId);
                                bookingId = minBookingController.GemBooking1(ankomst, afrejse, antalVærelser, antalPersoner, iKunde.KundeId, værelseId, pris);
                                forbrugId = minBookingController.OpretForbrugIDb(pris, bookingId); 
                                minBookingController.OpretForbrug(pris, forbrugId);
                                minBookingController.OpretBooking(ankomst, afrejse, antalVærelser, antalPersoner, bookingId);
                                minBookingController.TilknytForbrugTilVærelse(forbrugId, værelseId, bookingId);
                                minBookingController.TilknytKundeTilBooking(iKunde.KundeId);
                                minBookingController.TilknytBookingTilVærelse(bookingId, værelseId);
                            }
                            if (antalVærelser == 1)
                            {
                                MessageBox.Show("Du har oprettet en booking til kunden: " + iKunde.Navn);
                                lbDinBestilling.ItemsSource = minBookingController.Bookinger(bookingId);
                            }
                            else
                            {
                                MessageBox.Show("Du har booket: " + antalVærelser + " værelser, til kunden: " + iKunde.Navn);
                                lbDinBestilling.ItemsSource = minBookingController.Bookinger(bookingId);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Vælg ét værelse");
                        }
                    }
                    else
                    {
                        MessageBox.Show("Datoen stemmer ikke overens, prøv igen.");
                    }
            }
            catch // hvis try går galt, gør den dette
            {
                MessageBox.Show("Du skal vælge en kunde og booking først!");
            }
        }

        #region TextBlock load

        // textblockende der loader er at jeg har lavet en event til listboxen på mainwindow. 
        // textblockende viser hvad der er blevet valgt når man booker et værelse til en kunde. 

        // den første textblock viser den samlede pris.
        private void TextBlock_Loaded(object sender, RoutedEventArgs e)
        {
            DateTime ankomst = DateTime.Parse(dpAnkomst.SelectedDate.ToString());
            DateTime afrejse = DateTime.Parse(dpAfrejse.SelectedDate.ToString());
            IVærelse iVærelse = (IVærelse)lvVærelse.SelectedItem;
            int værelseId = iVærelse.VærelseId;

            var textBlock = sender as TextBlock;
            if (textBlock == null)
                return;
            textBlock.Text = minBookingController.SamletPris(ankomst, afrejse, værelseId).ToString();
        }

        // denne textblock viser antalpersoner der er valgt i comboboxen
        private void TextBlock_Loaded_1(object sender, RoutedEventArgs e)
        {
            var textBlock = sender as TextBlock;
            if (textBlock == null)
                return;
            int antalPersoner = (int)cbPersoner1.SelectedItem;

            textBlock.Text = antalPersoner.ToString();
        }

        // denne textblock viser ankomsten på det bookede værelse.
        private void TextBlock_Loaded_2(object sender, RoutedEventArgs e)
        {
            var textBlock = sender as TextBlock;
            if (textBlock == null)
                return;
            DateTime ankomst = (DateTime)dpAnkomst.SelectedDate.Value;

            textBlock.Text = ankomst.Date.ToString("dd/MM/yyyy");
        }

        // denne textblock viser hvornår afrejsen finder sted på det bookingen.
        private void TextBlock_Loaded_3(object sender, RoutedEventArgs e)
        {
            var textBlock = sender as TextBlock;
            if (textBlock == null)
                return;
            DateTime afrejse = (DateTime)dpAfrejse.SelectedDate.Value;

            textBlock.Text = afrejse.Date.ToString("dd/MM/yyyy");
        }
        #endregion

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            var checkbox = sender as CheckBox;
            if (lvVærelse.SelectedIndex != -1)
            {
                IVærelse værelse = (IVærelse)lvVærelse.SelectedItem;
                minBookingController.FindVærelse(værelse.VærelseId);
                if (checkbox.IsChecked == true)
                {
                    minBookingController.Tillægmorgenmad(50);

                    lvVærelse.ItemsSource = null;
                    lvVærelse.ItemsSource = minBookingController.VærelseList();
                }
            }
            else
            {
                MessageBox.Show("Vælg et værelse");
            }
        }

        private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
        {
              var checkbox = sender as CheckBox; // var betyder at chechkbox er lig med, det der står på højre side
              if (lvVærelse.SelectedIndex != -1)
              {
                  IVærelse værelse = (IVærelse)lvVærelse.SelectedItem;
                  minBookingController.FindVærelse(værelse.VærelseId);
                  if (checkbox.IsChecked == false)
                  {
                      minBookingController.Tillægmorgenmad(-50); // bruger metoden Tillægmorgenmad, -50 sættes ind som parameter, da metoden kræver en parameter af typen int.
                      lvVærelse.ItemsSource = null;
                      lvVærelse.ItemsSource = minBookingController.VærelseList();
                  }
              }
              else
              {
                  MessageBox.Show("Vælg et værelse");
              }
        }

        private void HentBookinger()
        {
            cbBookinger.ItemsSource = null;
            try
            {
                IKunde iKunde = minBookingController.HentAktuelKunde();
                for (int i = 0; i < iKunde.Bookinger.Count(); i++) // betingelsen er at i skal være mindre end antallet af iKunde.Bookinger
                {
                    cbBookinger.ItemsSource = iKunde.Bookinger; // cbBookinger.ItemseSoruce sættes lig med iKundes bookinger
                }
            }
            catch
            {
                MessageBox.Show("Prøv igen");
            }
        }

        private void cbBookinger_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cbBookinger.SelectedItem is IBooking) // hvis den valgte Item i cbBookinger er en iBooking
            {
                IBooking iBooking = (IBooking)cbBookinger.SelectedItem;

                dpAnkomst.SelectedDate = iBooking.Ankomst;
                dpAfrejse.SelectedDate = iBooking.Afrejse;
                cbPersoner1.SelectedItem = iBooking.AntalPersoner;
                cbVærelser1.SelectedItem = iBooking.AntalVærelser;
            }
        }
    }
}
